﻿using System;

namespace Kyoh.Lib.Excel
{
    /// <summary>オブジェクトの内部装飾を表します。</summary>
    public class Interior : Component
    {
        private Interior(object exInterior, Component parent)
			: base(exInterior, parent)
		{
		}

        /// <summary>Excel COM オブジェクトで、新しいインスタンスを初期化します。</summary>
        /// <param name="obj">Excel COM オブジェクト</param>
        /// <param name="parent">親となる <see cref="Component"/> オブジェクト。</param>
        internal static Interior Create(object obj, Component parent)
        {
            return obj == null ? null : new Interior(obj, parent);
        }

        /// <summary>背景色を取得・設定します。</summary>
        public VbColor Color
        {
            get { return VbColor.FromInteger((int)(double)base.GetProperty("Color")); }
            set { base.SetProperty("Color", value.ToInteger()); }
        }

        /// <summary>背景色をインデックスで取得・設定します。</summary>
        public int ColorIndex
        {
            get { return (int)base.GetProperty("ColorIndex"); }
            set { base.SetProperty("ColorIndex", value); }
        }

        /// <summary>背景色のグラデーションを取得・設定します。</summary>
        public Gradient Gradient
        {
            get
            {
                object baseObj = base.GetProperty("Gradient");
                switch (Reflect.GetComClassName(baseObj))
                {
                    case "LinearGradient":
                        return LinearGradient.Create(baseObj, this);
                    case "RectangularGradient":
                        return RectangularGradient.Create(baseObj, this);
                    default:
                        throw new NotSupportedException();
                }
            }
        }

        /// <summary>負数の場合、異なる色で表示するかどうかを取得・設定します。</summary>
        public bool InvertIfNegative
        {
            get { return (bool)base.GetProperty("InvertIfNegative"); }
            set { base.SetProperty("InvertIfNegative", value); }
        }

        /// <summary>背景パターンを取得・設定します。</summary>
        public Pattern Pattern
        {
            get { return (Pattern)(int)base.GetProperty("Pattern"); }
            set { base.SetProperty("Pattern", (int)value); }
        }

        /// <summary>背景パターンの色を取得・設定します。</summary>
        public VbColor PatternColor
        {
            get { return VbColor.FromInteger((int)(double)base.GetProperty("PatternColor")); }
            set { base.SetProperty("PatternColor", value.ToInteger()); }
        }

        /// <summary>背景パターンの色をインデックスで取得・設定します。</summary>
        public int PatternColorIndex
        {
            get { return (int)base.GetProperty("PatternColorIndex"); }
            set { base.SetProperty("PatternColorIndex", value); }
        }

        /// <summary>背景パターンの色をテーマ色で取得・設定します。</summary>
        public ThemeColor PatternThemeColor
        {
            get { return (ThemeColor)(int)base.GetProperty("PatternThemeColor"); }
            set { base.SetProperty("PatternThemeColor", (int)value); }
        }

        /// <summary>背景パターンの色の明度を取得・設定します。</summary>
        public double PatternTintAndShade
        {
            get { return (double)base.GetProperty("PatternTintAndShade"); }
            set { base.SetProperty("PatternTintAndShade", value); }
        }

        /// <summary>背景色をテーマ色で取得・設定します。</summary>
        public ThemeColor ThemeColor
        {
            get { return (ThemeColor)(int)base.GetProperty("ThemeColor"); }
            set { base.SetProperty("ThemeColor", (int)value); }
        }

        /// <summary>背景色の明度を取得・設定します。</summary>
        public float TintAndShade
        {
            get { return (float)base.GetProperty("TintAndShade"); }
            set { base.SetProperty("TintAndShade", value); }
        }
    }
}
